home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / C / LIB / UNIXLIB37B / !UnixLib37 / src / signal / s / _signal next >
Text File  |  1996-11-09  |  11KB  |  520 lines

  1. ;----------------------------------------------------------------------------
  2. ;
  3. ; $Source: /unixb/home/unixlib/source/unixlib37/src/signal/s/RCS/_signal,v $
  4. ; $Date: 1996/11/06 22:08:49 $
  5. ; $Revision: 1.2 $
  6. ; $State: Rel $
  7. ; $Author: unixlib $
  8. ;
  9. ; $Log: _signal,v $
  10. ; Revision 1.2  1996/11/06 22:08:49  unixlib
  11. ; Yet more changes by NB, PB and SC.
  12. ;
  13. ; Revision 1.1  1996/10/30 22:08:07  unixlib
  14. ; Initial revision
  15. ;
  16. ; Revision 1.2  1996/05/06 09:01:35  unixlib
  17. ; Updates to sources made by Nick Burrett, Peter Burwood and Simon Callan.
  18. ; Saved for 3.7a release.
  19. ;
  20. ; Revision 1.1  1996/04/19 21:34:32  simon
  21. ; Initial revision
  22. ;
  23. ;----------------------------------------------------------------------------
  24.  
  25.     GET    Unix37:unixlib.s.asm_dec
  26.  
  27.     AREA    |C$$code|,CODE,READONLY
  28.  
  29.     IMPORT    raise
  30.  
  31. |__raise|
  32.     CMP    a1,#0
  33.     MOVEQS    pc,lr
  34.     STMFD    sp,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr,pc}
  35.     SUB    sp,sp,#64
  36.     SUB    ip,pc,#4
  37.     MOV    a4,lr
  38.     ADD    a3,sp,#64
  39.     ORR    a2,fp,#&80000000    ; for __backtrace()
  40.     STMFD    sp!,{a2,a3,a4,ip}    ; create signal frame
  41.     ADD    fp,sp,#12
  42.     MOV    v1,sp
  43.     BL    |raise|
  44.     ADD    sp,v1,#16        ; skip signal frame
  45.     LDMFD    sp,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,pc}^
  46.  
  47.     IMPORT    |__backtrace|
  48.  
  49.     EXPORT    |__core|
  50. |__core|
  51.     MOV    a1,fp
  52.     B    |__backtrace|
  53.  
  54.  
  55.     AREA    |C$$wrcode|,CODE
  56.  
  57.     EXPORT    |__h_sigill|
  58. |__h_sigill|
  59.     STR    lr,[pc,#|__cbreg|-.-8+60]
  60.     ADR    lr,|__cbreg|
  61.     STMIA    lr!,{a1-ip}        ; store non-banked registers
  62.     STMIA    lr,{sp,lr}^        ; store banked registers
  63.     MOV    a1,#SIGILL
  64.     SUB    lr,lr,#13*4        ; adjust base register back
  65.     STR    a1,[pc,#|__cba1|-.-8]
  66.     B    |__h_cback|
  67.  
  68.     EXPORT    |__h_sigbus|
  69. |__h_sigbus|
  70.     SUB    lr,lr,#4
  71.     STR    lr,[pc,#|__cbreg|-.-8+60]
  72.     ADR    lr,|__cbreg|
  73.     STMIA    lr!,{a1-ip}        ; store non-banked registers
  74.     STMIA    lr,{sp,lr}^        ; store banked registers
  75.     MOV    a1,#SIGBUS
  76.     SUB    lr,lr,#13*4        ; adjust base register back
  77.     STR    a1,[pc,#|__cba1|-.-8]
  78.     B    |__h_cback|
  79.  
  80.     ; __h_sigsegv0 is for aborts during instruction prefetches
  81.     EXPORT    |__h_sigsegv0|
  82. |__h_sigsegv0|
  83.     SUB    lr,lr,#4
  84.     STR    lr,[pc,#|__cbreg|-.-8+60]
  85.     ADR    lr,|__cbreg|
  86.     STMIA    lr!,{a1-ip}        ; store non-banked registers
  87.     STMIA    lr,{sp,lr}^        ; store banked registers
  88.     MOV    a1,#SIGSEGV
  89.     SUB    lr,lr,#13*4        ; adjust base register back
  90.     STR    a1,[pc,#|__cba1|-.-8]
  91.     B    |__h_cback|
  92.  
  93.  
  94.     ; __h_sigsegv1 is for aborts during data access
  95.     EXPORT    |__h_sigsegv1|
  96. |__h_sigsegv1|
  97.     SUB    lr,lr,#8
  98.     STR    lr,[pc,#|__cbreg|-.-8+60]
  99.     ADR    lr,|__cbreg|
  100.     STMIA    lr!,{a1-ip}        ; store non-banked registers
  101.     STMIA    lr,{sp,lr}^        ; store banked registers
  102.  
  103.     LDR    r0, [pc, #|__cbreg| - . - 8+60]
  104.     ; SUB    lr,lr,#13*4        ; adjust base register back
  105.     BIC    r0, r0, #&fc000003
  106.     LDR    r1, [r0, #0]        ; get the instruction
  107.     ; Get the contents of the base register. We know it must be a
  108.     ; load/store data instruction because only that type of instruction
  109.     ; can cause this abort.
  110.     AND    r2, r1, #&f0000
  111.     ADR    lr, |__cbreg|
  112.     LDR    r3, [lr, r2, LSR #14]
  113.     ; If bit 26 is set, we have a LDR/STR, otherwise a LDM/STM
  114.     TST    r1, #(1:SHL:26)
  115.     BNE    |__h_sigsegv1.ldr.str|
  116.     ; If the instruction didn't have writeback, there is no need
  117.     ; to correct the base register. We will just raise the signal.
  118.     TST    r1, #(1:SHL:21)
  119.     MOVEQ    a1, #SIGSEGV
  120.     STREQ    a1, [pc, #|__cba1| - . - 8]
  121.     BEQ    |__h_cback|
  122.  
  123.     ; Bit 23 is the direction. From the register list bitmask,
  124.     ; calculate the number of registers saved so we may correct
  125.     ; the base register.
  126.     TST    r1, #(1:SHL:23)
  127.     MOVEQ    r6, #-4
  128.     MOVNE    r6, #4
  129.     MOV    r4, #0
  130.     MOV    r5, r1, LSL #16
  131. |__h_sigsegv1.count.regs|
  132.     MOVS    r5, r5, LSL #1
  133.     ADDCS    r4, r4, r6
  134.     BNE    |__h_sigsegv1.count.regs|
  135.     ; Subtract the bytes transferred off the base register.
  136.     SUB    r3, r3, r4
  137.     STR    r3, [lr, r2, LSR #14]
  138.     MOV    a1,#SIGSEGV
  139.     STR    a1,[pc,#|__cba1|-.-8]
  140.     B    |__h_cback|
  141.  
  142. |__h_sigsegv1.ldr.str|
  143.     ; If the instruction has pre-indexed addressing, the base register
  144.     ; does not need to be corrected because it is the true address
  145.     ; that caused the data abort.
  146.     TST    r1, #(1:SHL:24)
  147.     MOVEQ    a1, #SIGSEGV
  148.     STREQ    a1, [pc, #|__cba1| - . - 8]
  149.     BEQ    |__h_cback|
  150.  
  151.     ; Post indexed addressing.
  152.  
  153.     ; Separate the offset field.
  154.     MOV    r4, r1, LSL #20
  155.     MOV    r4, r4, LSR #20
  156.     ; If we have an immediate offset, things are very simple
  157.     TST    r1, #(1:SHL:25)
  158.     BEQ    |__h_sigsegv1.immediate.offset|
  159.     ; Get the value of the offset register (Rm)
  160.     AND    r5, r4, #15
  161.     LDR    r5, [lr, r5, LSL #2]
  162.  
  163.     ; Perform close inspection of the register shift amount. LDR/STR does
  164.     ; not have register specific shift amount. Get the shift type into r6.
  165.     AND    r6, r4, #96
  166.     MOVS    r6, r6, LSR #5
  167.     CMPNE    r6, #3
  168.     BNE    |__h_sigsegv1.others|
  169.  
  170.     MOV    r7, r4, LSR #7
  171.     ; logical shift left
  172.     CMP    r6, #0
  173.     MOVEQ    r4, r5, LSL r7
  174.     BEQ    |__h_sigsegv1.immediate.offset|
  175.  
  176.     ; rotate right with extend
  177.     LDR    r4, [pc, #|__cbreg| - . - 8+60]
  178.     TEQ    pc, r4, LSL #3 ; Get the aborted C flag
  179.     MOV    r4, r5, RRX
  180.     B    |__h_sigsegv1.immediate.offset|
  181.  
  182. |__h_sigsegv1.others|
  183.     MOVS    r7, r4, LSR #7
  184.     ORREQ    r7, r7, #32
  185.  
  186.     ; logical shift right
  187.     CMP    r6, #1
  188.     MOVEQ    r4, r5, LSR r7
  189.     ; arithmetic shift right
  190.     CMP    r6, #2
  191.     MOVEQ    r4, r5, ASR r7
  192.     ; rotate right
  193.     CMP    r6, #3
  194.     MOVEQ    r4, r5, ROR r7
  195.  
  196. |__h_sigsegv1.immediate.offset|
  197.     ; Do we have a positive or negative offset
  198.     TST    r1, #(1:SHL:23)
  199.     SUBEQ    r3, r3, r4
  200.     ADDNE    r3, r3, r4
  201.     MOV    a1, #SIGSEGV
  202.     STR    a1, [pc, #|__cba1| - . - 8]
  203.     B    |__h_cback|
  204.  
  205.  
  206.     EXPORT    |__h_errbuf|
  207. |__h_errbuf|
  208.     DCD    0
  209.  
  210.     IMPORT    |__unixlib_exec_sig_interrupt|
  211.     EXPORT    |__h_error|
  212. |__h_error|
  213.     ; Entered in USR mode
  214.     STMFD    sp!, {a1, a2, a3, lr}
  215.     ; errno = EOPSYS
  216.     LDR    a1, [pc, #errno_ptr - . - 8]
  217.     MOV    a2, #EOPSYS
  218.     STR    a2, [a1, #0]
  219.     ; sys_errlist = error string
  220.     LDR    a3, [pc, #|__h_errbuf|-.-8]
  221.     LDR    a1, [pc, #sys_errlist_ptr-.-8]
  222.     ADD    a2, a3, #8
  223.     STR    a2, [a1, #(EOPSYS:SHL:2)]
  224.  
  225.     ; Check the error number. It's value will determine the
  226.     ; appropriate signal to call.
  227.     LDR    a2, [a3, #4]
  228.     ; Check for a serious error.
  229.     TST    a2, #&80000000
  230.     MOVEQ    a1, #SIGERR
  231.     BLEQ    |__unixlib_exec_sig_interrupt|
  232.     LDMEQFD    sp!, {a1, a2, a3, pc}^
  233.  
  234.     BIC    a2, a2, #&80000000
  235.     MOV    a2, a2, LSR #8
  236.     AND    a2, a2, #&FF
  237.     CMP    a2,#&02
  238.     MOVEQ    a1,#SIGFPE
  239.     MOVNE    a1,#SIGEMT
  240.     BL    |__unixlib_exec_sig_interrupt|
  241.     LDMFD    sp!, {a1, a2, a3, pc}^
  242.  
  243.     IMPORT    |__errno|
  244. errno_ptr
  245.     DCD    |__errno|
  246.  
  247.     IMPORT    sys_errlist
  248. sys_errlist_ptr
  249.     DCD    sys_errlist
  250.  
  251.     ; This function is called when an Escape condition is detected
  252.  
  253.     EXPORT    |__h_sigint|
  254. |__h_sigint|
  255.     ; Entered in IRQ mode. Be quick by just clearing the escape
  256.     ; flag and setting a callback.
  257.  
  258.     ; Check for the escape condition
  259.     TST    r11,#64
  260.     MOVEQS    pc,lr
  261.     MOV    ip,#SIGINT
  262.     STR    ip,[pc,#|__cba1|-.-8]
  263.     MOV    ip,#1            ; set CallBack
  264.     STR    ip,[pc,#|__cbflg|-.-8]    ; set __cbflg bit 0
  265.     MOVS    pc,lr
  266.  
  267. ;    STMFD    sp!, {a1, a2, a3, lr}
  268. ;    ; Clear the escape condition
  269. ;    MOV    a1, #&7C
  270. ;    SWI    XOS_Byte
  271. ;    ; Add the signal callback handler to raise SIGINT.
  272. ;    ADR    a1, callback_signal
  273. ;    MOV    a2, #SIGINT
  274. ;    SWI    XOS_AddCallBack
  275. ;    LDMFD    sp!, {a1, a2, a3, pc}^
  276.  
  277. callback_signal
  278.     ; Entered in SVC mode
  279.     STMFD    sp!, {a1, a2, a3, a4, lr}
  280.     ; Change to USR mode
  281.     TEQP    pc, #0
  282.     MOV    a1, a1
  283.     ; Raise the signal
  284.     MOV    a1, r12
  285.     STMFD    sp!, {lr}
  286.     BL    |__unixlib_exec_sig_interrupt|
  287.     LDMFD    sp!, {lr}
  288.     ; Go back into SVC mode and return.
  289.     SWI    OS_EnterOS
  290.     LDMFD    sp!, {a1, a2, a3, a4, pc}^
  291.  
  292.     EXPORT    |__h_event|
  293. |__h_event|
  294.     ; Check for the event 'Internet event'.
  295.     CMP    a1, #19
  296.     MOVNES    pc, lr
  297.     STMFD    sp!, {lr}
  298.     ; Convert the internet event into a suitable signal for raising
  299.     CMP    a2, #1 ; Out-of-band data has arrived
  300.     ADREQ    a1, callback_signal
  301.     MOVEQ    a2, #SIGURG
  302.     SWIEQ    XOS_AddCallBack
  303.  
  304.     LDMFD    sp!, {pc}
  305.  
  306.     EXPORT    |__h_sigsys|
  307. |__h_sigsys|
  308.     ADR    ip,|__cbreg|
  309.     STMIA    ip,{lr}
  310.     MOV    ip,#SIGSYS
  311.     STR    ip,[pc,#|__cba1|-.-8]
  312.     ORR    ip,pc,#3        ; SVC mode
  313.     TEQP    ip,#0
  314.     MOV    a1,a1
  315.     STMFD    sp!,{lr}
  316.     SWI    XOS_SetCallBack
  317.     LDMFD    sp!,{lr}
  318.     ADR    ip,|__cbreg|
  319.     LDMIA    ip,{pc}^
  320.  
  321.  
  322.     EXPORT    |__h_cback|
  323. |__h_cback|
  324.     ORR    lr,pc,#&0c000000    ; USR mode IntOff
  325.     MOVS    pc,lr
  326.     MOV    a1,a1
  327.     ADR    lr,|__cbreg|        ; load USR reg.s
  328.     LDMIA    lr,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr}
  329.     SUB    sp,sp,#4
  330.     STMFD    sp!,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr}
  331.  
  332.     LDR    a4,[pc,#|__cbreg|-.-8+60]
  333.     STR    a4,[sp,#60]        ; saved USR pc
  334.  
  335.     LDR    a1,[pc,#|__cbflg|-.-8]
  336.     ANDS    a1,a1,#2        ; check __cbflg bit 1
  337.     SUBNE    a4,a4,#4
  338.  
  339.     MOV    a3,lr            ; saved USR lr
  340.     ADD    a2,sp,#64        ; saved USR sp
  341.     ORR    a1,fp,#&80000000    ; saved USR fp | 0x80000000
  342.     STMFD    sp!,{a1,a2,a3,a4}    ; create signal frame
  343.     ADD    fp,sp,#12
  344.     SWI    XOS_IntOn
  345.  
  346.     LDR    a1,[pc,#|__cbflg|-.-8]    ; check __cbflg bit 0
  347.     ANDS    a1,a1,#1
  348.     BEQ    |__h_cback_l1|
  349.  
  350.     MOV    a1,#&7c            ; clear Escape condition
  351.     SWI    XOS_Byte
  352.  
  353. |__h_cback_l1|
  354.     MOV    a1,#0
  355.     STR    a1,[pc,#|__cbflg|-.-8]
  356.     LDR    a1,[pc,#|__cba1|-.-8]
  357.     MOV    v1,sp
  358.     BL    |raise|
  359.     ADD    sp,v1,#16        ; skip signal frame
  360.     LDMFD    sp,{a1,a2,a3,a4,v1,v2,v3,v4,v5,v6,sl,fp,ip,sp,lr,pc}^
  361.  
  362.     EXPORT    |__cbreg|
  363. |__cbreg|
  364.     %    64
  365.  
  366.         ; bit 0 Escape condition flag
  367.         ; bit 1 no re-execute inst. flag
  368. |__cbflg|
  369.     DCD    0
  370.  
  371. |__cba1|
  372.     DCD    0
  373.  
  374.  
  375.     IMPORT    |_exit|
  376.  
  377.     EXPORT    |__h_exit|
  378. |__h_exit|
  379.     ORR    lr,pc,#&0c000000    ; USR mode IntOff
  380.     MOVS    pc,lr
  381.     MOV    a1,a1
  382.     MOV    a1,#EXIT_SUCCESS
  383.     B    |_exit|
  384.  
  385. ; Interval timer handler for ITIMER_REAL
  386.  
  387.     EXPORT    |__h_sigalrm|
  388. |__h_sigalrm|    ROUT
  389.     STMFD    sp!, {a1, a2, a3, lr}
  390.     ; Enter user mode
  391.     TEQP    pc, #0
  392.     MOV    a1, a1
  393.     STMFD    sp!, {lr}
  394.     ; Raise the SIGALRM signal
  395.     MOV    a1, #SIGALRM
  396.     BL    |__raise|
  397.     ; Have we previously setup a CallEvery handler
  398.     LDR    a1, [pc, #|__h_sigalrm_sema| - . - 8]
  399.     CMP    a1, #1
  400.     BEQ    %F00
  401.     ; r12->it_interval = 0 secs and 0 usecs then exit
  402.     LDMIA    ip, {a1, a2}
  403.     CMP    a1, #0
  404.     CMPEQ    a2, #0
  405.     BEQ    %F00
  406.     ; Calculate delay in csecs between successive calls
  407.     MOV    a3, #100
  408.     MLA    a1, a3, a1, a2
  409.     ADD    a1, a1, #1
  410.     ; Function to call
  411.     ADR    a2, |__h_sigalrm_init|
  412.     MOV    a3, ip
  413.     SWI    XOS_CallEvery
  414.     ; Set semaphore to say we have a CallEvery already set up
  415.     MOV    a1, #1
  416.     STR    a1, [pc, #|__h_sigalrm_sema| - . - 8]
  417. 00
  418.     LDMFD    sp!, {lr}
  419.     SWI    XOS_EnterOS
  420.     LDMFD    sp!, {a1, a2, a3, pc}
  421.  
  422.  
  423.     EXPORT    |__h_sigalrm_init|
  424. |__h_sigalrm_init|
  425.     STMFD    sp!, {a1, a2, lr}
  426.     ADR    a1, |__h_sigalrm|
  427.     MOV    a2, r12
  428.     SWI    XOS_AddCallBack
  429.     LDMFD    sp!, {a1, a2, pc}
  430.  
  431.     EXPORT    |__h_sigalrm_sema|
  432.     ; Set to one to prevent multiple CallEvery's being set up.
  433. |__h_sigalrm_sema|
  434.     DCD    0
  435.  
  436.  
  437. ; Interval timer handler for ITIMER_VIRTUAL
  438.  
  439.     EXPORT    |__h_sigvtalrm|
  440. |__h_sigvtalrm|
  441.     STMFD    sp!, {a1, a2, a3, lr}
  442.     TEQP    pc, #0
  443.     MOV    a1, a1
  444.     STMFD    sp!, {lr}
  445.     MOV    a1, #SIGVTALRM
  446.     BL    |__raise|
  447.     LDR    a1, [pc, #|__h_sigvtalrm_sema| - . - 8]
  448.     CMP    a1, #1
  449.     BEQ    %B00
  450.     LDMIA    ip, {a1, a2}
  451.     CMP    a1, #0
  452.     CMPEQ    a2, #0
  453.     BEQ    %B00
  454.     MOV    a3, #100
  455.     MLA    a1, a3, a1, a2
  456.     ADD    a1, a1, #1
  457.     ADR    a2, |__h_sigvtalrm_init|
  458.     MOV    a3, ip
  459.     SWI    XOS_CallEvery
  460.     MOV    a1, #1
  461.     STR    a1, [pc, #|__h_sigvtalrm_sema| - . - 8]
  462.     B    %B00
  463.  
  464.     EXPORT    |__h_sigvtalrm_init|
  465. |__h_sigvtalrm_init|
  466.     STMFD    sp!, {a1, a2, lr}
  467.     ADR    a1, |__h_sigvtalrm|
  468.     MOV    a2, r12
  469.     SWI    XOS_AddCallBack
  470.     LDMFD    sp!, {a1, a2, pc}
  471.  
  472.     EXPORT    |__h_sigvtalrm_sema|
  473.     ; Set to one to prevent multiple CallEvery's being set up.
  474. |__h_sigvtalrm_sema|
  475.     DCD    0
  476.  
  477. ; Interval timer handler for ITIMER_PROF
  478.  
  479.  
  480.     EXPORT    |__h_sigprof|
  481. |__h_sigprof|
  482.     STMFD    sp!, {a1, a2, a3, lr}
  483.     TEQP    pc, #0
  484.     MOV    a1, a1
  485.     STMFD    sp!, {lr}
  486.     MOV    a1, #SIGPROF
  487.     BL    |__raise|
  488.     LDR    a1, [pc, #|__h_sigprof_sema| - . - 8]
  489.     CMP    a1, #1
  490.     BEQ    %B00
  491.     LDMIA    ip, {a1, a2}
  492.     CMP    a1, #0
  493.     CMPEQ    a2, #0
  494.     BEQ    %B00
  495.     MOV    a3, #100
  496.     MLA    a1, a3, a1, a2
  497.     ADD    a1, a1, #1
  498.     ADR    a2, |__h_sigprof_init|
  499.     MOV    a3, ip
  500.     SWI    XOS_CallEvery
  501.     MOV    a1, #1
  502.     STR    a1, [pc, #|__h_sigprof_sema| - . - 8]
  503.     B    %B00
  504.  
  505.     EXPORT    |__h_sigprof_init|
  506. |__h_sigprof_init|
  507.     STMFD    sp!, {a1, a2, lr}
  508.     ADR    a1, |__h_sigprof|
  509.     MOV    a2, r12
  510.     SWI    XOS_AddCallBack
  511.     LDMFD    sp!, {a1, a2, pc}
  512.  
  513.     EXPORT    |__h_sigprof_sema|
  514.     ; Set to one to prevent multiple CallEvery's being set up.
  515. |__h_sigprof_sema|
  516.     DCD    0
  517.  
  518.  
  519.     END
  520.